"""


"""
from flask import abort, jsonify
from flask import current_app
from flask import g
from flask import request
from flask import session

from info import constants, db
from info.models import User, News, Comment
from info.utils.common import user_login_data
from info.utils.response_code import RET
from . import news_detail_blu
from flask import render_template


@news_detail_blu.route("/<int:news_id>")
@user_login_data
def news_detail(news_id):

    # 获取用户登录信息
    user = g.user

    # 点击排行
    # 查询数据库　查询新闻表　　排序　降序
    try:
        news_click = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)

    # 查询详情页的这篇新闻
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        abort(404)

    if not news:
        abort(404)

    # 点击量+1
    news.clicks += 1

    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)

    # 收藏和已收藏按钮的展示逻辑
    is_collected = False   # is_collected标记用户是否收藏这篇新闻, False表示没收藏

    # if 用户登录了:
    #     if  用户收藏了这边新闻:
    #         is_collected = True
    if user:
        if news in user.collection_news:  # user.collection_news 来拿到这个user用户所收藏的所有新闻（列表，每一个元素是News的对象）
            is_collected = True

    # 在加载详情页面的时候，也要查询这篇新闻下的所有的评论， 传到模板
    try:
        comments = Comment.query.filter(Comment.news_id==news.id).order_by(Comment.create_time.desc())
    except Exception as e:
        current_app.logger.error(e)
    # 将comments中的所有对象，转成字典
    comments_list = []
    for i in comments:
        comments_list.append(i.to_dict())

    # 将用户的点在评论列表传到模板中,为了明确某条评论有没有被用户点赞
    user_like_comments = []
    if user:
        for i in user.like_comments:    # user.like_comments 来获取 用户点赞过的所有评论
            user_like_comments.append(i.to_dict())

    # 获取这篇新闻的作者
    author = news.user   # news.user  获取这篇新闻的作者对象

    data = {
        "user": user.to_dict() if user else None,  # 如果user存在就返回user.to_dict(),如果不存在就返回None
        "news_click": news_click,
        "news": news.to_dict(),
        "is_collected": is_collected,
        "comments": comments_list,
        "user_like_comments": user_like_comments,
        "author": author.to_dict()
    }

    return render_template("news/detail.html", data=data)


@news_detail_blu.route("/news_collect", methods=["POST"])
@user_login_data
def news_collect():
    """
    处理  用户收藏新闻 的请求
    处理  用户取消收藏新闻 的请求

    参数：  action   news_id

    1, 获取用户登录信息，   如果获取不到(None)，则表示没有登录， 就return
    2, 获取参数
    3, 判空，校验
    4, 根据action的值是   collect  还是  cancel_collect  执行对应的操作
    5, 返回操作成功
    """

    # 1, 获取用户登录信息，   如果获取不到(None)，则表示没有登录， 就return
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
    # 2, 获取参数
    data_dict = request.json
    news_id = data_dict.get("news_id")
    action = data_dict.get("action")
    # 3, 判空，校验
    if not all([news_id, action]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    if action not in ("collect", "cancel_collect"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据库查询错误")

    if not news:
        return jsonify(errno=RET.NODATA,errmsg="没有这篇新闻")
    # 4, 根据action的值是     collect    还是    cancel_collect   执行对应的操作
    if action == "collect":
        # 执行收藏操作
        user.collection_news.append(news)
    else:
        # 执行取消收藏操作
        user.collection_news.remove(news)

    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg="数据库操作失败")

    # 5, 返回操作成功
    return jsonify(errno=RET.OK,errmsg="操作成功")


@news_detail_blu.route("/news_comment", methods=["POST"])
@user_login_data
def news_comment():
    """
    处理 评论新闻 请求      接受参数：   news_id(针对哪条新闻进行评论)    comment(评论的内容)
    处理 回复他人评论 请求   接受参数：   news_id(针对哪条新闻进行评论)    comment(评论的内容)    parent_id(父评论的id)

    1, 获取用户登录信息
    2, 获取参数
    3, 判空
    4, 创建Comment模型类对象，   Comment()    设置属性，  添加到数据库，提交
    5, 返回操作成功
    """
    # 1, 获取用户登录信息
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
    # 2, 获取参数
    data_dict = request.json
    news_id = data_dict.get("news_id")
    comment_str = data_dict.get("comment")
    parent_id = data_dict.get("parent_id")
    # 3, 判空，校验
    if not all([news_id, comment_str]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询错误")

    if not news:
        return jsonify(errno=RET.NODATA, errmsg="没有这篇新闻")
    # 4, 创建Comment模型类对象，   Comment()    设置属性，  添加到数据库，提交
    comment = Comment()
    comment.user_id = user.id
    comment.news_id = news_id
    comment.content = comment_str
    if parent_id:
        comment.parent_id = parent_id

    try:
        db.session.add(comment)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg="数据库操作失败")

    # 5, 返回操作成功
    return jsonify(errno=RET.OK, errmsg="操作成功", data=comment.to_dict())  # data=comment.to_dict() 为了前段ajax回调函数中使用这条评论的相关数据的展示


@news_detail_blu.route("/comment_like", methods=["POST"])
@user_login_data
def comment_like():
    """

    处理 点赞 请求
    处理 取消点赞 请求

    参数：  action     comment_id

    1, 获取用户登陆信息，  如果获取不到(None)，则表示没有登录， 就return
    2, 获取参数
    3, 判空校验
    4, 根据action  的值是 add  或者 remove  来执行对应的 点赞 或者 取消点赞
    5, 返回操作成功
    """

    # 1, 获取用户登录信息，   如果获取不到(None)，则表示没有登录， 就return
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
    # 2, 获取参数
    data_dict = request.json
    comment_id = data_dict.get("comment_id")
    action = data_dict.get("action")
    # 3, 判空，校验
    if not all([comment_id, action]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    if action not in ("add", "remove"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    try:
        comment = Comment.query.get(comment_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询错误")

    if not comment:
        return jsonify(errno=RET.NODATA, errmsg="没有这条评论")
    # 4,  根据action  的值是 add  或者 remove  来执行对应的 点赞 或者 取消点赞
    if action == "add":
        # 执行点赞操作
        user.like_comments.append(comment)
        comment.like_count += 1
    else:
        # 执行取消点赞操作
        user.like_comments.remove(comment)
        comment.like_count -= 1

    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")

    # 5, 返回操作成功
    return jsonify(errno=RET.OK, errmsg="操作成功")